# -*- coding: utf-8 -*- 

from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from datetime import datetime
from django.conf import settings
from django.core.mail import send_mail
from gouache.usuario.models import Usuario
from django.utils.encoding import smart_str, force_unicode

from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt






@login_required
def envio(request):
    from gouache.pagamento_digital import settings
    from gouache.pagamento_digital.functions import salva_pedido, recupera_carrinho
    from gouache.pagamento_digital.models import Cliente, Pedido, Produto
    
    #recupera as informacoes de cadastro do cliente para comunicacao com o 
    #pagamento digital
    try:
        cliente = Cliente.objects.get( usuario = request.user )
    except:
        cliente = Cliente( usuario = request.user )
        cliente.save()

    #gera o pedido que gerenciara a compra no sistema
    try:
        pedido = Pedido.objects.get( cliente = cliente, cod_status = -1 )
    except:
        pedido = Pedido(cliente = cliente, cod_status = -1 )
        pedido.save()

    dados_compra = []
    dados_compra.append( {'name':'id_pedido', 'value': pedido.id} )
    cliente.email = 'kalkehcoisa@gmail.com'
    cliente.nome = 'Jayme'
    cliente.rg = '115552229'
    cliente.data_emissao_rg = '10/10/2000'
    cliente.estado_emissor_rg = 'SP'
    cliente.orgao_emissor_rg = 'SSP'
    cliente.cpf = '33344422299'
    cliente.sexo = 'M'
    cliente.data_nascimento = '05/05/1995'
    cliente.telefone = '11223344'
    cliente.celular = '1122334455'
    cliente.endereco = 'Rua 35 N735 c Av92'
    cliente.complemento = ''
    cliente.bairro = 'Bairrera'
    cliente.cidade = 'Quack'
    cliente.estado = 'SP'
    cliente.cep = '11144-999'
    cliente.save()


    #recebe os dados do cliente para enviar para o pagamento digital
    dados_da_compra = {}
    dados_da_compra['id_pedido'] = pedido.id
    dados_da_compra['email'] = cliente.email
    dados_da_compra['nome'] = cliente.nome
    dados_da_compra['rg'] = cliente.rg
    dados_da_compra['data_emissao_rg'] = cliente.data_emissao_rg
    dados_da_compra['estado_emissor_rg'] = cliente.estado_emissor_rg
    dados_da_compra['orgao_emissor_rg'] = cliente.orgao_emissor_rg
    dados_da_compra['cpf'] = cliente.cpf
    dados_da_compra['sexo'] = cliente.sexo
    dados_da_compra['data_nascimento'] = cliente.data_nascimento
    dados_da_compra['telefone'] = cliente.telefone
    dados_da_compra['celular'] = cliente.celular
    dados_da_compra['endereco'] = cliente.endereco
    dados_da_compra['complemento'] = cliente.complemento
    dados_da_compra['bairro'] = cliente.bairro
    dados_da_compra['cidade'] = cliente.cidade
    dados_da_compra['estado'] = cliente.estado
    dados_da_compra['cep'] = cliente.cep



    #recupera os produtos que estao armazenados no carrinho do cliente
    '''
    este pacote nao possui carrinho proprio.
    implemente nesta funcao a recuperacao dos dados. Sugerimos que os dados
    sejam devolvidos num dicionario com os seguintes campos:
        produto_codigo_X
        produto_valor_X
        produto_descricao_X
        produto_qtde_X
        produto_extra_X - Campo opcional para dados de seu uso

    PS: o X e o indice dos produtos. O substitua por 1, 2, 3...1000(limite recomendado)
    '''
    carrinho = recupera_carrinho( pedido )
    i = 1
    for p in carrinho:
        dados_da_compra['produto_codigo_'+str(i)] = p['codigo']
        dados_da_compra['produto_descricao_'+str(i)] = p['descricao']
        dados_da_compra['produto_qtde_'+str(i)] = p['qtde']
        dados_da_compra['produto_valor_'+str(i)] = "%.2f" % p['valor']
        dados_da_compra['produto_extra_'+str(i)] = p['extra']
        i += 1



    #campos extras
    dados_da_compra['tipo_frete'] = ''
    dados_da_compra['desconto'] = '0.00'
    dados_da_compra['acrescimo'] = '0.00'
    dados_da_compra['parcela_maxima'] = '6' #numero maximo de parcelas para pagar
    dados_da_compra['free'] = ''


    #prepara os dados para serem enviados para o formulario
    dados_compra = []
    for p in dados_da_compra.keys():
        dados_compra.append( {'name' : p, 'value': dados_da_compra[p]} )


    dados_compra.append( {'name':'redirect', 'value': settings.PAGDIG_REDIRECT} )
    dados_compra.append( {'name':'redirect_time', 'value': settings.PAGDIG_REDIRECT_TIME} )
    return render_to_response('pagamento_digital/formulario_teste.html', locals(), context_instance=RequestContext(request))



@csrf_exempt
def recebe_resposta(request):
    from gouache.pagamento_digital import settings
    from django.utils.encoding import *



    if request.method == 'POST':
        request.encoding = 'ISO-8859-1'
        dados = request.POST
        
        #token de validacao
        token = settings.PAGDIG_TOKEN

        #chaves enviadas pelo retorno automatico do Pagamento Digital
        chaves = ['id_transacao', 'data_transacao', 'data_credito', 'valor_original', 'valor_loja']
        chaves += ['valor_total', 'desconto', 'acrescimo', 'tipo_pagamento', 'parcelas']
        chaves += ['cliente_nome', 'cliente_email', 'cliente_rg', 'cliente_data_emissao_rg']
        chaves += ['cliente_orgao_emissor_rg', 'cliente_estado_emissor_rg', 'cliente_cpf', 'cliente_sexo']
        chaves += ['cliente_data_nascimento', 'cliente_endereco', 'cliente_complemento', 'status']
        chaves += ['cod_status', 'cliente_bairro', 'cliente_cidade', 'cliente_estado', 'cliente_cep']
        chaves += ['frete', 'tipo_frete', 'informacoes_loja', 'id_pedido', 'free', 'qtde_produtos']

        params = request.POST.copy()
        for c in chaves:
            params.setlist( c, [params.get(c)] ) #remove todos os duplicados

        lista_valores = {}
        for key in chaves:
            lista_valores[(str)(key)] = params.get(key)


        #Essa variavel indica a quantidade de produtos retornados
        qtde_produtos = int( lista_valores['qtde_produtos'] )


        #envia os dados via POST para o pagamento digital para
        #realizar verificacao. Frisando: via POST.
        import urllib
        import urllib2

        enderecoPost = settings.PAGDIG_CHECKOUT_VERIFY

        dados_envio = {'transacao': ( lista_valores['id_transacao'] ),
                #'status': ( lista_valores['status'] ),
                'cod_status': ( lista_valores['cod_status'] ),
                'valor_original': ( lista_valores['valor_original'] ),
                'valor_loja': ( lista_valores['valor_loja'] ),
                'token': (token)
               }


        dados_envio = urllib.urlencode(dados_envio)
        #req = urllib2.Request(enderecoPost)#envia via GET,
        req = urllib2.Request(enderecoPost, dados_envio)#envia via POST
        response = urllib2.urlopen(req)
        resposta = response.read()

        resposta = resposta.strip(' \t\n\r').upper()

        if resposta == "VERIFICADO":
            #Loop para retornar dados dos produtos
            produtos = []
            for x in range(1, qtde_produtos+1):
                prod = {}
                prod['produto_codigo'] = dados.get('produto_codigo_'+str(x)).decode('iso-8859-1')
                prod['produto_descricao'] = dados.get('produto_descricao_'+str(x)).decode('iso-8859-1')
                prod['produto_qtde'] = dados.get('produto_qtde_'+str(x)).decode('iso-8859-1')
                prod['produto_valor'] = dados.get('produto_valor_'+str(x)).decode('iso-8859-1')
                prod['produto_extra'] = dados.get('produto_extra_'+str(x)).decode('iso-8859-1')
                produtos.append( prod )

            '''
            Apos obter as variaveis dos produtos, grava no banco de dados.
            '''

            #esta funcao e usada para realizar todas as operacoes como registrar
            #a venda no banco de dados local, etc
            from gouache.pagamento_digital.functions import salva_pedido
            salva_pedido( request, lista_valores, produtos )

    #raise Exception( resposta )
    return HttpResponse('')
